`timescale 1ns / 1ps
`include "const.v"
module MExcDetect(
    input [2:0] RinSel,
    input RegWr,
    input MemWr,
    input [1:0] store,
    input [2:0] Dop,
    input ld,
    input [31:0] AO,
    output isExc,
    output [4:0] ExcCode
    );

    wire le = ld && (
        Dop == 3'b000 && AO[1:0] ||
        (Dop == 3'b001 || Dop == 3'b010) && AO[0] ||
        Dop != 3'b000 && (AO > 32'h2fff || AO[31]) ||
        Dop == 0 && (AO[31] || AO > 32'h2fff && AO < 32'h7f00 || AO > 32'h7f0b && AO < 32'h7f10 || AO > 32'h7f1b)
    );

    wire se = MemWr && (
        store == 0 && AO[1:0] ||
        store == 2'b01 && AO[0] ||
        store != 0 && (AO > 32'h2fff || AO[31]) ||
        store == 0 && (AO[31] || AO > 32'h2fff && AO < 32'h7f00 || AO > 32'h7f0b && AO < 32'h7f10 || AO > 32'h7f1b) ||
        store == 0 && (AO == 32'h7f08 || AO == 32'h7f18)
    );

    assign isExc = se | le;

    assign ExcCode = (se? `AdES : le? `AdEL : 0);


endmodule